/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "Input.h"
#include "System.h"
#include <stdlib.h>
#include <stdio.h>


#ifdef WIN32
	#include <windows.h>
	#include <conio.h>
#else
	#include <unistd.h>
	#include <termios.h>
	#include <sys/time.h>
#endif


#ifndef WIN32
//fonctions internes
//spécifiques à linux
//
//Permet la modification des propriétées du terminal
int SetTerm(int org)
{
	static struct termios termAttr;
	int error = 0;

	//récupération des attributs du terminal
	if (tcgetattr(0, &termAttr) != 0)
	{
		error = 1;
	}
	else
	{
		//vérification de l'ordre
		if (org)
		{
			//on rétablit l'echo lors d'une entrée et les
			//signaux basiques (EOF, ...)
			termAttr.c_lflag |= (ICANON|ECHO);
		}
		else
		{
			//on enlève les signaux basiques et l'affichage
			termAttr.c_lflag &= ~(ICANON|ECHO);
		}

		//initialisation des nouveaux attributs
		if (tcsetattr(0, TCSANOW, &termAttr) != 0)
		{
			error = 1;
		}
	}
	return error;
}
#endif

//fonction externe
///////////////////////////////////////////////////////////
/// Permet d'attendre que l'utilisateur presse une touche
///////////////////////////////////////////////////////////
int DLL_IMPEXP CSLP_PollChar()
{
	int retVal = 0;
	#ifdef WIN32
	if (kbhit() != 0)
	{
		//touche appuyée et prette à être récupérée
		retVal = 1;
	}
	#else
	//initialisation des varaibles
	struct timeval sTime = {0, 0};
	fd_set readfds;
	FD_ZERO(&readfds);
	FD_SET(0, &readfds);
	//modifie les attributs du terminal
	if (SetTerm(0) != 0)
	{
		perror("Error: CSLP_PollChar can't initialize the terminal\n");
		retVal = -1;
	}
	else
	{
		retVal = select(1, &readfds, NULL, NULL, &sTime);
		//retVal = -1 	-> error
		//retVal = 0 	-> timeout
		//retVal > 0	-> event
	}
	#endif
	
	return retVal;
}

//fonction externe
//
///////////////////////////////////////////////////////////
/// Permet de récupérer la touche pressé par l'utilisateur
///////////////////////////////////////////////////////////
char DLL_IMPEXP CSLP_GetChar()
{
	char retVal = '\0';
	#ifdef WIN32
	if (kbhit() != 0)
	{
		//touche prette à être récupérée
		retVal = getch();
	}
	//si aucune touche n'a été appuyée, retval conserve sa valeur d'erreur '\0'
	#else
	//vérification de la présence d'une touche
	if (CSLP_PollChar() > 0)
	{
		//récupération de la touche
		retVal = getchar();
	}
	//rétablissement des paramètres par défaut du terminal
	if (SetTerm(1) != 0)
	{
		perror("Error: CSLP_GetChar can't initialize the terminal\n");
	}
	#endif
	return retVal;
}

///////////////////////////////////////////////////////////
/// Permet de récupérer la touche préssée par l'utilisateur.
///////////////////////////////////////////////////////////
int DLL_IMPEXP CSLP_WaitChar()
{
	int retVal;
	#ifdef WIN32
	retVal = getch();
	#else
	SetTerm(0);
	retVal = getchar();
	SetTerm(1);
	#endif
	return retVal;
}
